package com.eduagent.xwqeduagent.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.eduagent.xwqeduagent.api.characterRecognition.FormulaRecognition.FormulaRecognitionAPI;
import com.eduagent.xwqeduagent.common.BaseResponse;
import com.eduagent.xwqeduagent.common.ResultUtils;
import com.eduagent.xwqeduagent.exception.ErrorCode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@Slf4j
@RestController
@RequestMapping("/formula-recognition")
@Tag(name = "公式识别", description = "公式识别相关接口")
public class FormulaRecognitionController {

    @Value("${xunfei.api.formula-recognition.appid:637d1630}")
    private String appId;

    @Value("${xunfei.api.formula-recognition.apikey:8bd0514cb66802c719bbf34a908a0119}")
    private String apiKey;

    @Value("${xunfei.api.formula-recognition.apisecret:NzUyY2Y3OTYwYjAyMGExODc5OTM1ZGZl}")
    private String apiSecret;

    /**
     * 上传图片识别公式
     *
     * @param file 图片文件
     * @return 识别结果
     */
    @Operation(summary = "公式识别", description = "通过上传图片识别公式")
    @PostMapping(value = "/recognize", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public BaseResponse<?> recognizeFormula(@Parameter(description = "图片文件，支持jpg/png/bmp格式，最大4M") @RequestPart("file") MultipartFile file) {
        try {
            // 检查API配置
            if (appId == null || appId.isEmpty() || apiKey == null || apiKey.isEmpty() || apiSecret == null || apiSecret.isEmpty()) {
                log.error("讯飞平台配置缺失，请配置xunfei.api.formula-recognition相关参数");
                return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统配置错误，请联系管理员");
            }

            // 检查文件是否为空
            if (file.isEmpty()) {
                return ResultUtils.error(ErrorCode.PARAMS_ERROR, "上传文件为空");
            }

            // 检查文件大小
            if (file.getSize() > 4 * 1024 * 1024) {
                return ResultUtils.error(ErrorCode.PARAMS_ERROR, "文件大小超过4M限制");
            }

            // 检查文件类型
            String contentType = file.getContentType();
            if (contentType == null || !(contentType.contains("jpeg") || contentType.contains("png") || contentType.contains("bmp"))) {
                return ResultUtils.error(ErrorCode.PARAMS_ERROR, "仅支持jpg/png/bmp格式图片");
            }

            // 创建API实例
            FormulaRecognitionAPI api = new FormulaRecognitionAPI(appId, apiKey, apiSecret);

            // 读取上传的文件内容
            byte[] fileContent = file.getBytes();

            // 调用API进行识别
            String jsonResult = api.recognizeFromByteArray(fileContent);
            log.info("公式识别API返回结果：{}", jsonResult);

            // 直接提取content字段返回
            JSONObject jsonObject = JSON.parseObject(jsonResult);
            if (jsonObject.getIntValue("code") == 0 && jsonObject.containsKey("data")) {
                JSONObject dataObj = jsonObject.getJSONObject("data");
                if (dataObj.containsKey("region")) {
                    JSONObject region = dataObj.getJSONArray("region").getJSONObject(0);
                    if (region.containsKey("recog")) {
                        String content = region.getJSONObject("recog").getString("content");
                        return ResultUtils.success(content);
                    }
                }
            }
            
            // 如果未找到content字段
            return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "未找到识别内容");

        } catch (Exception e) {
            log.error("处理上传文件失败", e);
            return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "处理上传文件失败：" + e.getMessage());
        }
    }

    /**
     * 通过Base64编码识别公式
     *
     * @param base64 图片Base64编码
     * @return 识别结果
     */
    @Operation(summary = "Base64公式识别", description = "通过Base64编码识别公式")
    @PostMapping("/recognize-base64")
    public BaseResponse<?> recognizeFormulaByBase64(@Parameter(description = "图片Base64编码，不含前缀") @RequestParam("base64") String base64) {
        try {
            // 检查API配置
            if (appId == null || appId.isEmpty() || apiKey == null || apiKey.isEmpty() || apiSecret == null || apiSecret.isEmpty()) {
                log.error("讯飞平台配置缺失，请配置xunfei.api.formula-recognition相关参数");
                return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统配置错误，请联系管理员");
            }

            // 检查Base64是否为空
            if (base64 == null || base64.isEmpty()) {
                return ResultUtils.error(ErrorCode.PARAMS_ERROR, "Base64编码为空");
            }

            // 检查Base64大小
            if (base64.length() > (4 * 1024 * 1024) * 1.33) { // Base64编码大约是原始大小的4/3
                return ResultUtils.error(ErrorCode.PARAMS_ERROR, "Base64编码大小超过限制");
            }

            // 创建API实例
            FormulaRecognitionAPI api = new FormulaRecognitionAPI(appId, apiKey, apiSecret);

            // 调用API进行识别
            String jsonResult = api.recognizeFromBase64(base64);
            log.info("公式识别API返回结果：{}", jsonResult);

            // 直接提取content字段返回
            JSONObject jsonObject = JSON.parseObject(jsonResult);
            if (jsonObject.getIntValue("code") == 0 && jsonObject.containsKey("data")) {
                JSONObject dataObj = jsonObject.getJSONObject("data");
                if (dataObj.containsKey("region")) {
                    JSONObject region = dataObj.getJSONArray("region").getJSONObject(0);
                    if (region.containsKey("recog")) {
                        String content = region.getJSONObject("recog").getString("content");
                        return ResultUtils.success(content);
                    }
                }
            }
            
            // 如果未找到content字段
            return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "未找到识别内容");

        } catch (Exception e) {
            log.error("识别公式异常", e);
            return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统异常：" + e.getMessage());
        }
    }
} 